package A2013;
/*
小明参加了学校的趣味运动会，其中的一个项目是：跳格子。
    地上画着一些格子，每个格子里写一个字，如下所示：（也可参见p1.jpg）
 从我做起振
 我做起振兴
 做起振兴中
 起振兴中华
    比赛时，先站在左上角的写着“从”字的格子里，可以横向或纵向跳到相邻的格子里，但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
    要求跳过的路线刚好构成“从我做起振兴中华”这句话。

    请你帮助小明算一算他一共有多少种可能的跳跃路线呢？
 答案是一个整数，请通过浏览器直接提交该数字。
 注意：不要提交解答过程，或其它辅助说明类的内容
【解析】：将格子中的字存放到一个二维数组中，使用回溯法依次进行遍历，符合条件的+1，最后求出总和
 */
public class _2_振兴中华 {
    //做递归要考虑三个要素，1重复，2变化，3边界
    public static int[][] tu={{1,2,3,4,5},
            {2,3,4,5,6},
            {3,4,5,6,7},
            {4,5,6,7,8}};
    public static int arr=0;
    public static void main(String [] args){
        int sum=0;
        f(0,0,0);//
        System.out.println("总共"+arr);
    }
    public static void f(int x,int y,int sum){
        if(x>3||y>4) return;
        sum+=tu[x][y];
        if (sum==36){
            arr++;
        }
        f(x+1,y,sum);
        f(x,y+1,sum);
    }
}
/*
递归的理解:
自己调用自己
递归通常不在意具体操作，只关心初始条件和上下层的变化关系。
递归函数需要有临界停止点，即递归不能无限制的执行下去。通常这个点为必须经过的一个数。
递归通常能被其他方案替代(栈、数组正向求)。
 */